//ioc的理解
/* 
IoC 全称为 Inversion of Control, 控制反转 它是一种设计原则，负责将对象创建和依赖管理的控制权从应用程序代码内部转移到框架或容器当中。这样做的好处是可以减少代码之间的耦合，使得代码更灵活和易于维护。
*/

// 为什么需要IoC
/* 
在传统的编程方式中，一个类B如果需要依赖另一个类A去完善逻辑，通常会自己创建类A的实例。这会导致代码紧密耦合，难以进行单元测试和维护。例如：
*/
/* 
// 发动机
class Engine {
  start() {
    console.log('Engine started')
  }
}

// 车
class Car {
  constructor() {
    this.Engine = new Engine()
  }

  start() {
    this.Engine.start()
  }
}

const myCar = new Car()
myCar.start() 
*/

/* 
在上面的例子中，Car类自己创建了Engine的实例。如果我们想使用不同的引擎，就需要修改Car类创建实例部分的代码，这样会增加代码的复杂性，IoC解决了传统编程方式中的这个问题。
*/

// 发动机
class Engine {
  start() {
    console.log('Engine started')
  }
}

// 车
class Car {
  constructor(engine) {// 自己声明的构造函数
    this.Engine = engine // 通过构造函数注入依赖
  }

  start() {
    this.Engine.start()
  }
}

// 外部容器创建并注入依赖
const myEngine = new Engine();
const myCar = new Car(myEngine) // 将Engine实例注入到Car
myCar.start() 

/* 
在这个例子中，Car类不再自己创建Engine实例，而是通过构造函数接收一个Engine实例。这样可以很容易地替换不同的引擎，而不需要修改Car类的代码。
*/

// 深入参考
// https://juejin.cn/post/7368521915152826377